/**
 * @file id_generator.h
 * @brief 文件ID生成器
 * @details 生成6位Base62编码的唯一文件ID
 */

#pragma once

#include <string>
#include <random>

/**
 * @class IdGenerator
 * @brief 6位文件ID生成器
 * @details 使用Base62编码生成唯一的6位文件标识符，包含碰撞检测和重试机制
 */
class IdGenerator 
{
public:
    /**
     * @brief 根据文件哈希生成6位ID
     * @param hash 文件SHA-256哈希值
     * @return std::string 6位Base62编码的ID
     */
    static std::string generateFromHash(const std::string& hash);
    
    /**
     * @brief 生成随机6位ID
     * @return std::string 6位Base62编码的随机ID
     */
    static std::string generateRandom();
    
    /**
     * @brief 验证ID格式是否正确
     * @param id 要验证的ID
     * @return bool ID格式是否正确
     */
    static bool validateId(const std::string& id);
    
    /**
     * @brief 生成唯一ID（避免数据库碰撞）
     * @param hash 文件哈希值（可选，用于种子）
     * @param max_retries 最大重试次数
     * @return std::string 唯一的6位ID，失败返回空字符串
     */
    static std::string generateUniqueId(const std::string& hash = "", int max_retries = 10);

private:
    /**
     * @brief Base62字符集
     */
    static const char BASE62_CHARS[62];
    
    /**
     * @brief 将数值转换为Base62字符串
     * @param value 输入数值
     * @param length 输出长度
     * @return std::string Base62编码的字符串
     */
    static std::string toBase62(uint64_t value, int length);
    
    /**
     * @brief 从Base62字符串转换为数值
     * @param str Base62编码的字符串
     * @return uint64_t 对应的数值
     */
    static uint64_t fromBase62(const std::string& str);
    
    /**
     * @brief 计算校验码
     * @param id 4位主ID
     * @return std::string 2位校验码
     */
    static std::string calculateChecksum(const std::string& id);
    
    /**
     * @brief 获取随机数生成器
     * @return std::mt19937& 随机数生成器引用
     */
    static std::mt19937& getRandomEngine();
}; 